{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Make Cats and Dogs For TFLite.ipynb","version":"0.3.2","provenance":[{"file_id":"1Fl7Fk20-G6KVg400bhCZOWlJHNNQiDiv","timestamp":1564807038856}],"collapsed_sections":[],"toc_visible":true},"kernelspec":{"name":"python3","display_name":"Python 3"},"accelerator":"GPU"},"cells":[{"cell_type":"markdown","metadata":{"colab_type":"text","id":"oYM61xrTsP5d"},"source":["# Transfer Learning with TensorFlow Hub for TFLite"]},{"cell_type":"markdown","metadata":{"colab_type":"text","id":"bL54LWCHt5q5"},"source":["## Set up library versions for TF2"]},{"cell_type":"code","metadata":{"colab_type":"code","id":"110fGB18UNJn","outputId":"ce113d21-abcc-4b8e-c81d-33e6a19406a5","executionInfo":{"status":"ok","timestamp":1564807101605,"user_tz":420,"elapsed":39188,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}},"colab":{"base_uri":"https://localhost:8080/","height":68}},"source":["# !pip uninstall tensorflow --yes\n","!pip install -U --pre -q tensorflow-gpu==2.0.0-beta1\n","# !pip install -U --pre -q tf-nightly-gpu-2.0-preview==2.0.0.dev20190715\n","# Last tested version: 2.0.0-dev20190704"],"execution_count":1,"outputs":[{"output_type":"stream","text":["\u001b[K     |████████████████████████████████| 348.9MB 71kB/s \n","\u001b[K     |████████████████████████████████| 3.1MB 56.0MB/s \n","\u001b[K     |████████████████████████████████| 501kB 50.6MB/s \n","\u001b[?25h"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"Tw_-ZX_8tXkG","colab_type":"code","colab":{}},"source":["# !pip install -U --pre -q tf-estimator-nightly==1.14.0.dev2019071001"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"colab_type":"code","id":"5MzNyBJVE_jQ","outputId":"87061aef-9f5a-4c8a-b7b5-f7a925a1adcb","executionInfo":{"status":"ok","timestamp":1562317293241,"user_tz":-330,"elapsed":52642,"user":{"displayName":"Kinar R","photoUrl":"https://lh4.googleusercontent.com/-AAvWa6FYPEM/AAAAAAAAAAI/AAAAAAAAIXU/nG0y9HXFLy0/s64/photo.jpg","userId":"15335582918464257700"}},"colab":{"base_uri":"https://localhost:8080/","height":68}},"source":["# !pip uninstall tensorflow-hub --yes\n","# !pip install -U --pre -q tf-hub-nightly==0.6.0.dev201907150002\n","# Last tested version: Hub version:  0.6.0.dev201907160002"],"execution_count":0,"outputs":[{"output_type":"stream","text":["Uninstalling tensorflow-hub-0.4.0:\n","  Successfully uninstalled tensorflow-hub-0.4.0\n","\u001b[K     |████████████████████████████████| 81kB 3.1MB/s \n","\u001b[?25h"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab_type":"code","id":"dlauq-4FWGZM","outputId":"8daca8e9-a967-410a-b57e-7881c43acdd8","executionInfo":{"status":"ok","timestamp":1564807244434,"user_tz":420,"elapsed":446,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}},"colab":{"base_uri":"https://localhost:8080/","height":85}},"source":["from __future__ import absolute_import, division, print_function\n","\n","import os\n","\n","import matplotlib.pylab as plt\n","import numpy as np\n","\n","import tensorflow as tf\n","import tensorflow_hub as hub\n","\n","print(\"Version: \", tf.__version__)\n","print(\"Eager mode: \", tf.executing_eagerly())\n","print(\"Hub version: \", hub.__version__)\n","print(\"GPU is\", \"available\" if tf.test.is_gpu_available() else \"NOT AVAILABLE\")"],"execution_count":3,"outputs":[{"output_type":"stream","text":["Version:  2.0.0-beta1\n","Eager mode:  True\n","Hub version:  0.5.0\n","GPU is available\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"colab_type":"text","id":"mmaHHH7Pvmth"},"source":["## Select the Hub/TF2 module to use\n","\n","Hub modules for TF 1.x won't work here, please use one of the selections provided."]},{"cell_type":"code","metadata":{"colab_type":"code","id":"FlsEcKVeuCnf","outputId":"7ee09765-6404-44c9-9e10-d4e1c5f715b3","executionInfo":{"status":"ok","timestamp":1564807248164,"user_tz":420,"elapsed":547,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}},"colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["module_selection = (\"mobilenet_v2\", 224, 1280) #@param [\"(\\\"mobilenet_v2\\\", 224, 1280)\", \"(\\\"inception_v3\\\", 299, 2048)\"] {type:\"raw\", allow-input: true}\n","handle_base, pixels, FV_SIZE = module_selection\n","MODULE_HANDLE =\"https://tfhub.dev/google/tf2-preview/{}/feature_vector/4\".format(handle_base)\n","IMAGE_SIZE = (pixels, pixels)\n","print(\"Using {} with input size {} and output dimension {}\".format(\n","  MODULE_HANDLE, IMAGE_SIZE, FV_SIZE))"],"execution_count":4,"outputs":[{"output_type":"stream","text":["Using https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4 with input size (224, 224) and output dimension 1280\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"sYUsgwCBv87A","colab_type":"text"},"source":["## Data preprocessing"]},{"cell_type":"markdown","metadata":{"id":"8nqVX3KYwGPh","colab_type":"text"},"source":["Use [TensorFlow Datasets](http://tensorflow.org/datasets) to load the cats and dogs dataset.\n","\n","This `tfds` package is the easiest way to load pre-defined data. If you have your own data, and are interested in importing using it with TensorFlow see [loading image data](../load_data/images.ipynb)\n"]},{"cell_type":"code","metadata":{"id":"jGvpkDj4wBup","colab_type":"code","colab":{}},"source":["import tensorflow_datasets as tfds\n","tfds.disable_progress_bar()"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"YkF4Boe5wN7N","colab_type":"text"},"source":["The `tfds.load` method downloads and caches the data, and returns a `tf.data.Dataset` object. These objects provide powerful, efficient methods for manipulating data and piping it into your model.\n","\n","Since `\"cats_vs_dog\"` doesn't define standard splits, use the subsplit feature to divide it into (train, validation, test) with 80%, 10%, 10% of the data respectively."]},{"cell_type":"code","metadata":{"id":"SQ9xK9F2wGD8","colab_type":"code","outputId":"7d2a9b61-0859-4b14-c218-1e1e1a93d38b","executionInfo":{"status":"ok","timestamp":1564807281721,"user_tz":420,"elapsed":28411,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}},"colab":{"base_uri":"https://localhost:8080/","height":207}},"source":["splits = tfds.Split.ALL.subsplit(weighted=(80, 10, 10))\n","\n","splits, info = tfds.load('cats_vs_dogs', with_info=True, as_supervised=True, split = splits)\n","\n","(train_examples, validation_examples, test_examples) = splits\n","\n","num_examples = info.splits['train'].num_examples\n","num_classes = info.features['label'].num_classes"],"execution_count":6,"outputs":[{"output_type":"stream","text":["\u001b[1mDownloading and preparing dataset cats_vs_dogs (786.68 MiB) to /root/tensorflow_datasets/cats_vs_dogs/2.0.1...\u001b[0m\n"],"name":"stdout"},{"output_type":"stream","text":["/usr/local/lib/python3.6/dist-packages/urllib3/connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings\n","  InsecureRequestWarning)\n","WARNING: Logging before flag parsing goes to stderr.\n","W0803 04:41:17.875909 140336087701376 cats_vs_dogs.py:117] 1738 images were corrupted and were skipped\n","W0803 04:41:17.886837 140336087701376 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow_datasets/core/file_format_adapter.py:209: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.\n","Instructions for updating:\n","Use eager execution and: \n","`tf.data.TFRecordDataset(path)`\n"],"name":"stderr"},{"output_type":"stream","text":["\u001b[1mDataset cats_vs_dogs downloaded and prepared to /root/tensorflow_datasets/cats_vs_dogs/2.0.1. Subsequent calls will reuse this data.\u001b[0m\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"pmXQYXNWwf19","colab_type":"text"},"source":["### Format the Data\n","\n","Use the `tf.image` module to format the images for the task.\n","\n","Resize the images to a fixes input size, and rescale the input channels"]},{"cell_type":"code","metadata":{"id":"y7UyXblSwkUS","colab_type":"code","colab":{}},"source":["def format_image(image, label):\n","  image = tf.image.resize(image, IMAGE_SIZE) / 255.0\n","  return  image, label"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"1nrDR8CnwrVk","colab_type":"text"},"source":["Now shuffle and batch the data\n"]},{"cell_type":"code","metadata":{"id":"zAEUG7vawxLm","colab_type":"code","colab":{}},"source":["BATCH_SIZE = 32 #@param {type:\"integer\"}"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"fHEC9mbswxvM","colab_type":"code","colab":{}},"source":["train_batches = train_examples.shuffle(num_examples // 4).map(format_image).batch(BATCH_SIZE).prefetch(1)\n","validation_batches = validation_examples.map(format_image).batch(BATCH_SIZE).prefetch(1)\n","test_batches = test_examples.map(format_image).batch(1)"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"ghQhZjgEw1cK","colab_type":"text"},"source":["Inspect a batch"]},{"cell_type":"code","metadata":{"id":"gz0xsMCjwx54","colab_type":"code","outputId":"496f6815-545a-4780-95ba-048ae097f2f7","executionInfo":{"status":"ok","timestamp":1564807304501,"user_tz":420,"elapsed":5985,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}},"colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["for image_batch, label_batch in train_batches.take(1):\n","  pass\n","\n","image_batch.shape"],"execution_count":10,"outputs":[{"output_type":"execute_result","data":{"text/plain":["TensorShape([32, 224, 224, 3])"]},"metadata":{"tags":[]},"execution_count":10}]},{"cell_type":"markdown","metadata":{"colab_type":"text","id":"FS_gVStowW3G"},"source":["\n","## Defining the model\n","\n","All it takes is to put a linear classifier on top of the `feature_extractor_layer` with the Hub module.\n","\n","For speed, we start out with a non-trainable `feature_extractor_layer`, but you can also enable fine-tuning for greater accuracy."]},{"cell_type":"code","metadata":{"colab_type":"code","id":"RaJW3XrPyFiF","colab":{}},"source":["do_fine_tuning = False #@param {type:\"boolean\"}"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"wd0KfstqaUmE","colab_type":"text"},"source":["Load TFHub Module"]},{"cell_type":"code","metadata":{"id":"svvDrt3WUrrm","colab_type":"code","colab":{}},"source":["feature_extractor = hub.KerasLayer(MODULE_HANDLE,\n","                                   input_shape=IMAGE_SIZE + (3,), \n","                                   output_shape=[FV_SIZE],\n","                                   trainable=do_fine_tuning)"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"colab_type":"code","id":"50FYNIb1dmJH","outputId":"35bdff25-9729-488d-c902-c0a43058ca77","executionInfo":{"status":"ok","timestamp":1564807316938,"user_tz":420,"elapsed":1270,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}},"colab":{"base_uri":"https://localhost:8080/","height":238}},"source":["print(\"Building model with\", MODULE_HANDLE)\n","model = tf.keras.Sequential([\n","    feature_extractor,\n","    tf.keras.layers.Dense(num_classes, activation='softmax')\n","])\n","model.summary()"],"execution_count":13,"outputs":[{"output_type":"stream","text":["Building model with https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4\n","Model: \"sequential\"\n","_________________________________________________________________\n","Layer (type)                 Output Shape              Param #   \n","=================================================================\n","keras_layer (KerasLayer)     (None, 1280)              2257984   \n","_________________________________________________________________\n","dense (Dense)                (None, 2)                 2562      \n","=================================================================\n","Total params: 2,260,546\n","Trainable params: 2,562\n","Non-trainable params: 2,257,984\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"1PzLoQK0Zadv","colab_type":"code","colab":{}},"source":["#@title (Optional) Unfreeze some layers\n","NUM_LAYERS = 10 #@param {type:\"slider\", min:1, max:50, step:1}\n","      \n","if do_fine_tuning:\n","  feature_extractor.trainable = True\n","  \n","  for layer in model.layers[-NUM_LAYERS:]:\n","    layer.trainable = True\n","\n","else:\n","  feature_extractor.trainable = False"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"colab_type":"text","id":"u2e5WupIw2N2"},"source":["## Training the model"]},{"cell_type":"code","metadata":{"colab_type":"code","id":"9f3yBUvkd_VJ","colab":{}},"source":["if do_fine_tuning:\n","  model.compile(\n","    optimizer=tf.keras.optimizers.SGD(lr=0.002, momentum=0.9), \n","    loss=tf.keras.losses.SparseCategoricalCrossentropy(),\n","    metrics=['accuracy'])\n","else:\n","  model.compile(\n","    optimizer='adam', \n","    loss='sparse_categorical_crossentropy',\n","    metrics=['accuracy'])"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"colab_type":"code","id":"w_YKX2Qnfg6x","colab":{"base_uri":"https://localhost:8080/","height":258},"outputId":"d5a797cf-811c-4291-ba49-fec475a2ca7d","executionInfo":{"status":"ok","timestamp":1564807543787,"user_tz":420,"elapsed":219466,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}}},"source":["EPOCHS = 5\n","hist = model.fit(train_batches,\n","                    epochs=EPOCHS,\n","                    validation_data=validation_batches)"],"execution_count":16,"outputs":[{"output_type":"stream","text":["Epoch 1/5\n"],"name":"stdout"},{"output_type":"stream","text":["W0803 04:42:08.886037 140336087701376 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n","Instructions for updating:\n","Use tf.where in 2.0, which has the same broadcast rule as np.where\n"],"name":"stderr"},{"output_type":"stream","text":["582/582 [==============================] - 49s 84ms/step - loss: 0.0554 - accuracy: 0.9806 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00\n","Epoch 2/5\n","582/582 [==============================] - 43s 73ms/step - loss: 0.0290 - accuracy: 0.9906 - val_loss: 0.0364 - val_accuracy: 0.9879\n","Epoch 3/5\n","582/582 [==============================] - 43s 73ms/step - loss: 0.0241 - accuracy: 0.9928 - val_loss: 0.0361 - val_accuracy: 0.9871\n","Epoch 4/5\n","582/582 [==============================] - 42s 73ms/step - loss: 0.0209 - accuracy: 0.9940 - val_loss: 0.0365 - val_accuracy: 0.9858\n","Epoch 5/5\n","582/582 [==============================] - 42s 73ms/step - loss: 0.0185 - accuracy: 0.9950 - val_loss: 0.0373 - val_accuracy: 0.9862\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"u_psFoTeLpHU","colab_type":"text"},"source":["## Export the model"]},{"cell_type":"code","metadata":{"id":"XaSb5nVzHcVv","colab_type":"code","colab":{}},"source":["CATS_VS_DOGS_SAVED_MODEL = \"exp_saved_model\""],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"fZqRAg1uz1Nu","colab_type":"text"},"source":["Export the SavedModel"]},{"cell_type":"code","metadata":{"id":"yJMue5YgnwtN","colab_type":"code","colab":{}},"source":["tf.saved_model.save(model, CATS_VS_DOGS_SAVED_MODEL)"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"SOQF4cOan0SY","colab_type":"code","outputId":"de9bbf7f-ccbd-4fb2-ca0a-9a51b5cb200a","executionInfo":{"status":"ok","timestamp":1564807570755,"user_tz":420,"elapsed":2993,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}},"colab":{"base_uri":"https://localhost:8080/","height":204}},"source":["%%bash -s $CATS_VS_DOGS_SAVED_MODEL\n","saved_model_cli show --dir $1 --tag_set serve --signature_def serving_default"],"execution_count":19,"outputs":[{"output_type":"stream","text":["The given SavedModel SignatureDef contains the following input(s):\n","  inputs['keras_layer_input'] tensor_info:\n","      dtype: DT_FLOAT\n","      shape: (-1, 224, 224, 3)\n","      name: serving_default_keras_layer_input:0\n","The given SavedModel SignatureDef contains the following output(s):\n","  outputs['dense'] tensor_info:\n","      dtype: DT_FLOAT\n","      shape: (-1, 2)\n","      name: StatefulPartitionedCall:0\n","Method name is: tensorflow/serving/predict\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"FY7QGBgBytwX","colab_type":"code","colab":{}},"source":["loaded = tf.saved_model.load(CATS_VS_DOGS_SAVED_MODEL)"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"tIhPyMISz952","colab_type":"code","outputId":"efc5a8ca-fe57-4f64-a674-a4c7959be223","executionInfo":{"status":"ok","timestamp":1564807581465,"user_tz":420,"elapsed":440,"user":{"displayName":"Laurence Moroney","photoUrl":"https://lh3.googleusercontent.com/a-/AAuE7mD9NVHs11eHKKpV6n5e3VXiH_A-nLCCH7WbvcUq=s64","userId":"06401446828348966425"}},"colab":{"base_uri":"https://localhost:8080/","height":68}},"source":["print(list(loaded.signatures.keys()))\n","infer = loaded.signatures[\"serving_default\"]\n","print(infer.structured_input_signature)\n","print(infer.structured_outputs)"],"execution_count":21,"outputs":[{"output_type":"stream","text":["['serving_default']\n","((), {'keras_layer_input': TensorSpec(shape=(None, 224, 224, 3), dtype=tf.float32, name='keras_layer_input')})\n","{'dense': TensorSpec(shape=(None, 2), dtype=tf.float32, name='dense')}\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"XxLiLC8n0H16","colab_type":"text"},"source":["## Convert using TFLite's Converter"]},{"cell_type":"markdown","metadata":{"id":"1aUYvCpfWmrQ","colab_type":"text"},"source":["Load the TFLiteConverter with the SavedModel"]},{"cell_type":"code","metadata":{"id":"dqJRyIg8Wl1n","colab_type":"code","colab":{}},"source":["converter = tf.lite.TFLiteConverter.from_saved_model(CATS_VS_DOGS_SAVED_MODEL)"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"AudcNjT0UtfF","colab_type":"text"},"source":["### Post-training quantization\n","The simplest form of post-training quantization quantizes weights from floating point to 8-bits of precision. This technique is enabled as an option in the TensorFlow Lite converter. At inference, weights are converted from 8-bits of precision to floating point and computed using floating-point kernels. This conversion is done once and cached to reduce latency.\n","\n","To further improve latency, hybrid operators dynamically quantize activations to 8-bits and perform computations with 8-bit weights and activations. This optimization provides latencies close to fully fixed-point inference. However, the outputs are still stored using floating point, so that the speedup with hybrid ops is less than a full fixed-point computation."]},{"cell_type":"code","metadata":{"id":"WmSr2-yZoUhz","colab_type":"code","colab":{}},"source":["converter.optimizations = [tf.lite.Optimize.DEFAULT]"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"YpCijI08UxP0","colab_type":"text"},"source":["### Post-training integer quantization\n","We can get further latency improvements, reductions in peak memory usage, and access to integer only hardware accelerators by making sure all model math is quantized. To do this, we need to measure the dynamic range of activations and inputs with a representative data set. You can simply create an input data generator and provide it to our converter."]},{"cell_type":"code","metadata":{"id":"clM_dTIkWdIa","colab_type":"code","colab":{}},"source":["def representative_data_gen():\n","  for input_value, _ in test_batches.take(100):\n","    yield [input_value]"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"0oPkAxDvUias","colab_type":"code","colab":{}},"source":["converter.representative_dataset = representative_data_gen"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"IGUAVTqXVfnu","colab_type":"text"},"source":["The resulting model will be fully quantized but still take float input and output for convenience.\n","\n","Ops that do not have quantized implementations will automatically be left in floating point. This allows conversion to occur smoothly but may restrict deployment to accelerators that support float. "]},{"cell_type":"markdown","metadata":{"id":"cPVdjaEJVkHy","colab_type":"text"},"source":["### Full integer quantization\n","\n","To require the converter to only output integer operations, one can specify:"]},{"cell_type":"code","metadata":{"id":"eQi1aO2cVhoL","colab_type":"code","colab":{}},"source":["converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"snwssESbVtFw","colab_type":"text"},"source":["### Finally convert the model"]},{"cell_type":"code","metadata":{"id":"tUEgr46WVsqd","colab_type":"code","colab":{}},"source":["tflite_model = converter.convert()\n","tflite_model_file = 'converted_model.tflite'\n","\n","with open(tflite_model_file, \"wb\") as f:\n","  f.write(tflite_model)"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"BbTF6nd1KG2o","colab_type":"text"},"source":["##Test the TFLite model using the Python Interpreter"]},{"cell_type":"code","metadata":{"id":"dg2NkVTmLUdJ","colab_type":"code","colab":{}},"source":["# Load TFLite model and allocate tensors.\n","  \n","interpreter = tf.lite.Interpreter(model_path=tflite_model_file)\n","interpreter.allocate_tensors()\n","\n","input_index = interpreter.get_input_details()[0][\"index\"]\n","output_index = interpreter.get_output_details()[0][\"index\"]"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"snJQVs9JNglv","colab_type":"code","outputId":"1b949129-5697-4971-b426-2aba55357095","executionInfo":{"status":"ok","timestamp":1562317477851,"user_tz":-330,"elapsed":1986,"user":{"displayName":"Kinar R","photoUrl":"https://lh4.googleusercontent.com/-AAvWa6FYPEM/AAAAAAAAAAI/AAAAAAAAIXU/nG0y9HXFLy0/s64/photo.jpg","userId":"15335582918464257700"}},"colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["from tqdm import tqdm\n","\n","# Gather results for the randomly sampled test images\n","predictions = []\n","\n","test_labels, test_imgs = [], []\n","for img, label in tqdm(test_batches.take(10)):\n","  interpreter.set_tensor(input_index, img)\n","  interpreter.invoke()\n","  predictions.append(interpreter.get_tensor(output_index))\n","  \n","  test_labels.append(label.numpy()[0])\n","  test_imgs.append(img)"],"execution_count":0,"outputs":[{"output_type":"stream","text":["10it [00:01,  8.49it/s]\n"],"name":"stderr"}]},{"cell_type":"code","metadata":{"id":"YMTWNqPpNiAI","colab_type":"code","cellView":"both","colab":{}},"source":["#@title Utility functions for plotting\n","# Utilities for plotting\n","\n","class_names = ['cat', 'dog']\n","\n","def plot_image(i, predictions_array, true_label, img):\n","  predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]\n","  plt.grid(False)\n","  plt.xticks([])\n","  plt.yticks([])\n","    \n","  img = np.squeeze(img)\n","\n","  plt.imshow(img, cmap=plt.cm.binary)\n","\n","  predicted_label = np.argmax(predictions_array)\n","  if predicted_label == true_label:\n","    color = 'green'\n","  else:\n","    color = 'red'\n","  \n","  plt.xlabel(\"{} {:2.0f}% ({})\".format(class_names[predicted_label],\n","                                100*np.max(predictions_array),\n","                                class_names[true_label]),\n","                                color=color)\n","\n"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"fK_CTyL3XQt1","colab_type":"text"},"source":["NOTE: Colab runs on server CPUs. At the time of writing this, TensorFlow Lite doesn't have super optimized server CPU kernels. For this reason post-training full-integer quantized models  may be slower here than the other kinds of optimized models. But for mobile CPUs, considerable speedup can be observed."]},{"cell_type":"code","metadata":{"id":"1-lbnicPNkZs","colab_type":"code","cellView":"both","outputId":"2ad2f129-9f13-4491-d632-03028a2af193","executionInfo":{"status":"ok","timestamp":1562317480305,"user_tz":-330,"elapsed":1229,"user":{"displayName":"Kinar R","photoUrl":"https://lh4.googleusercontent.com/-AAvWa6FYPEM/AAAAAAAAAAI/AAAAAAAAIXU/nG0y9HXFLy0/s64/photo.jpg","userId":"15335582918464257700"}},"colab":{"base_uri":"https://localhost:8080/","height":201}},"source":["#@title Visualize the outputs { run: \"auto\" }\n","index = 2 #@param {type:\"slider\", min:0, max:9, step:1}\n","plt.figure(figsize=(6,3))\n","plt.subplot(1,2,1)\n","plot_image(index, predictions, test_labels, test_imgs)\n","plt.show()"],"execution_count":0,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n78ZrLv5/tCI7TbX3jLYAAAAASUVORK5CYII=\n","text/plain":["<Figure size 432x216 with 1 Axes>"]},"metadata":{"tags":[]}}]},{"cell_type":"markdown","metadata":{"id":"PmZRieHmKLY5","colab_type":"text"},"source":["Download the model"]},{"cell_type":"code","metadata":{"id":"0jJAxrQB2VFw","colab_type":"code","colab":{}},"source":["from google.colab import files\n","\n","files.download('converted_model.tflite')\n","\n","labels = ['cat', 'dog']\n","\n","with open('labels.txt', 'w') as f:\n","  f.write('\\n'.join(labels))\n","  \n","files.download('labels.txt')"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"BDlmpjC6VnFZ","colab_type":"text"},"source":["# Prepare the test images for download (Optional)"]},{"cell_type":"markdown","metadata":{"id":"_1ja_WA0WZOH","colab_type":"text"},"source":["This part involves downloading additional test images for the Mobile Apps only in case you need to try out more samples"]},{"cell_type":"code","metadata":{"id":"fzLKEBrfTREA","colab_type":"code","colab":{}},"source":["!mkdir -p test_images"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"Qn7ukNQCSewb","colab_type":"code","colab":{}},"source":["from PIL import Image\n","\n","for index, (image, label) in enumerate(test_batches.take(50)):\n","  image = tf.cast(image * 255.0, tf.uint8)\n","  image = tf.squeeze(image).numpy()\n","  pil_image = Image.fromarray(image)\n","  pil_image.save('test_images/{}_{}.jpg'.format(class_names[label[0]], index))"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"xVKKWUG8UMO5","colab_type":"code","outputId":"0460a572-d6b7-41f1-9886-22d0cb5bd776","executionInfo":{"status":"ok","timestamp":1560756150446,"user_tz":-330,"elapsed":3611,"user":{"displayName":"Kinar R","photoUrl":"https://lh4.googleusercontent.com/-AAvWa6FYPEM/AAAAAAAAAAI/AAAAAAAAIXU/nG0y9HXFLy0/s64/photo.jpg","userId":"15335582918464257700"}},"colab":{"base_uri":"https://localhost:8080/","height":121}},"source":["!ls test_images"],"execution_count":0,"outputs":[{"output_type":"stream","text":["0.jpg\t15.jpg\t20.jpg\t26.jpg\t31.jpg\t37.jpg\t42.jpg\t48.jpg\t8.jpg\n","10.jpg\t16.jpg\t21.jpg\t27.jpg\t32.jpg\t38.jpg\t43.jpg\t49.jpg\t9.jpg\n","11.jpg\t17.jpg\t22.jpg\t28.jpg\t33.jpg\t39.jpg\t44.jpg\t4.jpg\t{}.jpg\n","12.jpg\t18.jpg\t23.jpg\t29.jpg\t34.jpg\t3.jpg\t45.jpg\t5.jpg\n","13.jpg\t19.jpg\t24.jpg\t2.jpg\t35.jpg\t40.jpg\t46.jpg\t6.jpg\n","14.jpg\t1.jpg\t25.jpg\t30.jpg\t36.jpg\t41.jpg\t47.jpg\t7.jpg\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"l_w_-UdlS9Vi","colab_type":"code","colab":{}},"source":["!zip -qq cats_vs_dogs_test_images.zip -r test_images/"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"Giva6EHwWm6Y","colab_type":"code","colab":{}},"source":["files.download('cats_vs_dogs_test_images.zip')"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"L_qI1_8HgxYW","colab_type":"code","colab":{}},"source":[""],"execution_count":0,"outputs":[]}]}